package cn.org.xiaosheng.hutool.utils;

import cn.hutool.http.HttpGlobalConfig;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.alibaba.fastjson.JSONObject;

import java.util.Map;

/**
 * @author XiaoSheng
 * @date 2023-11-17
 * @dec Post请求封装的方法类
 */
public class PostUtils {


    /**
     * 获取Post请求对象
     * @param url
     * @return
     */
    public static HttpRequest post(String url) {
        return get(Method.POST, url);
    }

    /**
     * 创建Http请求对象
     * Method 是一个枚举对象 拥有如下方法:
     * 	GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE, CONNECT, PATCH
     * @return
     */
    public static HttpRequest get(Method method, String url) {
        return HttpUtil.createPost(url);
    }

    /**
     * 发送post请求<br>
     * 请求体body参数支持两种类型：
     *
     * <pre>
     * 1. 标准参数，例如 a=1&amp;b=2 这种格式
     * 2. Rest模式，此时body需要传入一个JSON或者XML字符串，Hutool会自动绑定其对应的Content-Type
     * </pre>
     *
     * @param url 网址
     * @param body      post表单数据
     * @return 返回数据
     */
    public static String postJSONData(String url, String body) {
        return post(url).timeout(HttpGlobalConfig.getTimeout()).body(body).execute().body();
    }

    /**
     * 发送post请求<br>
     * 请求体body参数支持两种类型：
     *
     * <pre>
     * 1. 标准参数，例如 a=1&amp;b=2 这种格式
     * 2. Rest模式，此时body需要传入一个JSON或者XML字符串，Hutool会自动绑定其对应的Content-Type
     * </pre>
     *
     * @param url 网址
     * @param body      post表单数据
     * @return 返回数据
     */
    public static JSONObject postJSONData(String url, Map<String, String> headers, String body) {
        return postJSONData(url, headers, body, HttpGlobalConfig.getTimeout());
    }

    /**
     * 发送post请求<br>
     * 请求体body参数支持两种类型：
     *
     * <pre>
     * 1. 标准参数，例如 a=1&amp;b=2 这种格式
     * 2. Rest模式，此时body需要传入一个JSON或者XML字符串，Hutool会自动绑定其对应的Content-Type
     * </pre>
     *
     * @param url 网址
     * @param body      post表单数据
     * @return 返回数据
     */
    public static JSONObject postJSONData(String url, Map<String, String> headers, String body, int timeout) {
        String respData = post(url).addHeaders(headers).timeout(timeout).body(body).execute().body();
        return (JSONObject) JSONObject.parse(respData);
    }

    /**
     * 发送post请求
     *
     * @param url 网址
     * @param paramMap  post表单数据
     * @return 返回数据
     */
    public static String postFormData(String url, Map<String, Object> paramMap) {
        return postFormData(url, paramMap, HttpGlobalConfig.getTimeout());
    }

    /**
     * 发送post请求
     *
     * @param url 网址
     * @param paramMap  post表单数据
     * @param timeout   超时时长，-1表示默认超时，单位毫秒
     * @return 返回数据
     * @since 3.2.0
     */
    public static String postFormData(String url, Map<String, Object> paramMap, int timeout) {
        return post(url).form(paramMap).timeout(timeout).execute().body();
    }

}
